The R markdown is available from the pulldown menu for Code
at the upper-right, choose “Download Rmd”, or download
the Rmd from GitHub.
This short notebook reviews how to add annotations in Cytoscape.
Installation
Install the latest version of RCy3 from Bioconductor.
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("RCy3")
library(RCy3)
Required Software
The whole point of RCy3 is to connect with Cytoscape. You will need
to install and launch Cytoscape:
Check connection
Then, launch Cytoscape and keep it running whenever using RCy3 and
Jupyter Bridge. Confirm that you have everything installed and
running:
cytoscapeVersionInfo()
cytoscapePing()
Background
Annotations in Cytoscape Cytoscape has three separate drawing
surfaces on which the network and annotations are drawn:
- Network canvas: where nodes and edges are drawn.
- Background canvas: the drawing surface behind nodes and edges.
- Foreground canvas: the drawing surface in front of nodes and
edges.
Annotations are drawn either on the foreground or background
canvases, and are exported as objects. They are high quality
graphically, allowing for export of images. Annotation types:
- Shapes, Text, Bounded Text, Images and Arrows
- Groups, to group annotations together
Annotation Panel in the Cytoscape
You can find annotation tab on the left side of the Cytoscape, and
you can manually add annotations there. You can also add annotation via
commands to acheive automation.
Adding a Label Annotation
Import STE12 subnetwork of galFiltered network, for use with this
tutorial.
importNetworkFromNDEx('8f800fbf-35e5-11ec-b3be-0ac135e8bacf')
Create and execute the funtion to add a text annotation.
addAnnotationText(text='Mutation', network='current')
You will notice the annotation is located at the center of the
network. To adjust the location of the annotation, first click the
Toggle Annotation Selection. The annotation can now be moved by click
and drag.
Or you can enter x and y parameter when you create the
annotation.
addAnnotationText(text='Protein', network='current', x.pos = 2500, y.pos = 2500)
To customize the appearance of the annotation, you can specify the
font, color etc in the function.
addAnnotationText(text='Gene', network='current', x.pos=2550, y.pos=2550, fontSize=48, color='#FD39B8', fontStyle='bold')
You can find other command arguments here.
Adding a Shape Annotation
addAnnotationShape(customShape="RECTANGLE",network='current',x.pos=2250, y.pos=2390, fillColor='#e0f3db', height=200, width=240)
By default the shape will be drawn on the foreground canvas,
obstructing any nodes behind it. To move it to the background cavnas,
select the shape in the Layers tab in the Annotation panel and click the
Push Annotations to Background Layer arrow just below the list.
Or you can add canvas argument in your function. First, let us delete
this shape annotation.
deleteAnnotation(names="Shape 1")
Then, we add the correct one.
addAnnotationShape(customShape="RECTANGLE", canvas='background',network='current',x.pos=2250, y.pos=2390, fillColor='#e0f3db', height=200, width=240)
As usual, you can choose border color, border opacity, fill color and
other parameters by adding arguments in the command.
You can find other command arguments here.
Editing Annotations
Existing annotations can be updated via annotation update commands.
You may notice that each annotation has its own unique ID. When you want
to update a exisiting annotaion, the unique ID is required. You can also
use annotation names to update the annotation.
All annotation ID can be found by listing annotation.
annotationList <- getAnnotationList(network='current')
annotationList
LS0tCnRpdGxlOiAiQWR2YW5jZWQgVmlzdWFsaXphdGlvbjogV29ya2luZyB3aXRoIEFubm90YXRpb25zIgphdXRob3I6ICJZaWhhbmcgWGluLCBLcmlzdGluYSBIYW5zcGVycywgQWxleCBQaWNvIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKKlRoZSBSIG1hcmtkb3duIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBwdWxsZG93biBtZW51IGZvciogQ29kZSAqYXQgdGhlIHVwcGVyLXJpZ2h0LCBjaG9vc2UgIkRvd25sb2FkIFJtZCIsIG9yIFtkb3dubG9hZCB0aGUgUm1kIGZyb20gR2l0SHViXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS1hdXRvbWF0aW9uL21hc3Rlci9mb3Itc2NyaXB0ZXJzL1Ivbm90ZWJvb2tzL3dvcmtpbmctd2l0aC1hbm5vdGF0aW9uLlJtZCkuKgoKPGhyIC8+ClRoaXMgc2hvcnQgbm90ZWJvb2sgcmV2aWV3cyBob3cgdG8gYWRkIGFubm90YXRpb25zIGluIEN5dG9zY2FwZS4KCiMgSW5zdGFsbGF0aW9uCkluc3RhbGwgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFJDeTMgZnJvbSBCaW9jb25kdWN0b3IuCmBgYHtyIGV2YWw9RkFMU0V9CmlmICghcmVxdWlyZU5hbWVzcGFjZSgiQmlvY01hbmFnZXIiLCBxdWlldGx5ID0gVFJVRSkpCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJCaW9jTWFuYWdlciIpCkJpb2NNYW5hZ2VyOjppbnN0YWxsKCJSQ3kzIikKbGlicmFyeShSQ3kzKQpgYGAKCiMgUmVxdWlyZWQgU29mdHdhcmUKVGhlIHdob2xlIHBvaW50IG9mIFJDeTMgaXMgdG8gY29ubmVjdCB3aXRoIEN5dG9zY2FwZS4gWW91IHdpbGwgbmVlZCB0byBpbnN0YWxsIGFuZCBsYXVuY2ggQ3l0b3NjYXBlOiAKICAgIAoqIERvd25sb2FkIHRoZSBsYXRlc3QgQ3l0b3NjYXBlIGZyb20gaHR0cDovL3d3dy5jeXRvc2NhcGUub3JnL2Rvd25sb2FkLnBocAoqIENvbXBsZXRlIGluc3RhbGxhdGlvbiB3aXphcmQKKiBMYXVuY2ggQ3l0b3NjYXBlIAoKIyBDaGVjayBjb25uZWN0aW9uClRoZW4sIGxhdW5jaCBDeXRvc2NhcGUgYW5kIGtlZXAgaXQgcnVubmluZyB3aGVuZXZlciB1c2luZyBSQ3kzIGFuZCBKdXB5dGVyIEJyaWRnZS4gQ29uZmlybSB0aGF0IHlvdSBoYXZlIGV2ZXJ5dGhpbmcgaW5zdGFsbGVkIGFuZCBydW5uaW5nOgpgYGB7ciBldmFsPUZBTFNFfQpjeXRvc2NhcGVWZXJzaW9uSW5mbygpCmN5dG9zY2FwZVBpbmcoKQpgYGAKCgoKIyBCYWNrZ3JvdW5kCkFubm90YXRpb25zIGluIEN5dG9zY2FwZQpDeXRvc2NhcGUgaGFzIHRocmVlIHNlcGFyYXRlIGRyYXdpbmcgc3VyZmFjZXMgb24gd2hpY2ggdGhlIG5ldHdvcmsgYW5kIGFubm90YXRpb25zIGFyZSBkcmF3bjoKCiogTmV0d29yayBjYW52YXM6IHdoZXJlIG5vZGVzIGFuZCBlZGdlcyBhcmUgZHJhd24uCiogQmFja2dyb3VuZCBjYW52YXM6IHRoZSBkcmF3aW5nIHN1cmZhY2UgYmVoaW5kIG5vZGVzIGFuZCBlZGdlcy4KKiBGb3JlZ3JvdW5kIGNhbnZhczogdGhlIGRyYXdpbmcgc3VyZmFjZSBpbiBmcm9udCBvZiBub2RlcyBhbmQgZWRnZXMuCgpBbm5vdGF0aW9ucyBhcmUgZHJhd24gZWl0aGVyIG9uIHRoZSBmb3JlZ3JvdW5kIG9yIGJhY2tncm91bmQgY2FudmFzZXMsIGFuZCBhcmUgZXhwb3J0ZWQgYXMgb2JqZWN0cy4gVGhleSBhcmUgaGlnaCBxdWFsaXR5IGdyYXBoaWNhbGx5LCBhbGxvd2luZyBmb3IgZXhwb3J0IG9mIGltYWdlcy4gQW5ub3RhdGlvbiB0eXBlczoKCiogU2hhcGVzLCBUZXh0LCBCb3VuZGVkIFRleHQsIEltYWdlcyBhbmQgQXJyb3dzCiogR3JvdXBzLCB0byBncm91cCBhbm5vdGF0aW9ucyB0b2dldGhlcgoKCiMgQW5ub3RhdGlvbiBQYW5lbCBpbiB0aGUgQ3l0b3NjYXBlCllvdSBjYW4gZmluZCBhbm5vdGF0aW9uIHRhYiBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBDeXRvc2NhcGUsIGFuZCB5b3UgY2FuIG1hbnVhbGx5IGFkZCBhbm5vdGF0aW9ucyB0aGVyZS4gWW91IGNhbiBhbHNvIGFkZCBhbm5vdGF0aW9uIHZpYSBjb21tYW5kcyB0byBhY2hlaXZlIGF1dG9tYXRpb24uCgoKIyBBZGRpbmcgYSBMYWJlbCBBbm5vdGF0aW9uCkltcG9ydCBTVEUxMiBzdWJuZXR3b3JrIG9mIGdhbEZpbHRlcmVkIG5ldHdvcmssIGZvciB1c2Ugd2l0aCB0aGlzIHR1dG9yaWFsLgoKYGBge3IgZXZhbD1GQUxTRX0KaW1wb3J0TmV0d29ya0Zyb21OREV4KCc4ZjgwMGZiZi0zNWU1LTExZWMtYjNiZS0wYWMxMzVlOGJhY2YnKQpgYGAKCkNyZWF0ZSBhbmQgZXhlY3V0ZSB0aGUgZnVudGlvbiB0byBhZGQgYSB0ZXh0IGFubm90YXRpb24uCgpgYGB7ciBldmFsPUZBTFNFfQphZGRBbm5vdGF0aW9uVGV4dCh0ZXh0PSdNdXRhdGlvbicsIG5ldHdvcms9J2N1cnJlbnQnKQpgYGAKWW91IHdpbGwgbm90aWNlIHRoZSBhbm5vdGF0aW9uIGlzIGxvY2F0ZWQgYXQgdGhlIGNlbnRlciBvZiB0aGUgbmV0d29yay4gVG8gYWRqdXN0IHRoZSBsb2NhdGlvbiBvZiB0aGUgYW5ub3RhdGlvbiwgZmlyc3QgY2xpY2sgdGhlIFRvZ2dsZSBBbm5vdGF0aW9uIFNlbGVjdGlvbi4gVGhlIGFubm90YXRpb24gY2FuIG5vdyBiZSBtb3ZlZCBieSBjbGljayBhbmQgZHJhZy4KCk9yIHlvdSBjYW4gZW50ZXIgeCBhbmQgeSBwYXJhbWV0ZXIgd2hlbiB5b3UgY3JlYXRlIHRoZSBhbm5vdGF0aW9uLgpgYGB7ciBldmFsPUZBTFNFfQphZGRBbm5vdGF0aW9uVGV4dCh0ZXh0PSdQcm90ZWluJywgbmV0d29yaz0nY3VycmVudCcsIHgucG9zID0gMjUwMCwgeS5wb3MgPSAyNTAwKQpgYGAKVG8gY3VzdG9taXplIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBhbm5vdGF0aW9uLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbnQsIGNvbG9yIGV0YyBpbiB0aGUgZnVuY3Rpb24uCmBgYHtyIGV2YWw9RkFMU0V9CmFkZEFubm90YXRpb25UZXh0KHRleHQ9J0dlbmUnLCBuZXR3b3JrPSdjdXJyZW50JywgeC5wb3M9MjU1MCwgeS5wb3M9MjU1MCwgZm9udFNpemU9NDgsIGNvbG9yPScjRkQzOUI4JywgZm9udFN0eWxlPSdib2xkJykKYGBgCllvdSBjYW4gZmluZCBvdGhlciBjb21tYW5kIGFyZ3VtZW50cyBbaGVyZV0oaHR0cDovL2xvY2FsaG9zdDoxMjM0L3YxL3N3YWdnZXJVSS9zd2FnZ2VyLXVpL2luZGV4Lmh0bWw/dXJsPWh0dHAlM0ElMkYlMkZsb2NhbGhvc3QlM0ExMjM0JTJGdjElMkZjb21tYW5kcyUyRnN3YWdnZXIuanNvbiMhL2Fubm90YXRpb24vYW5ub3RhdGlvbl9hZGRfdGV4dCkuCgoKIyBBZGRpbmcgYSBTaGFwZSBBbm5vdGF0aW9uCmBgYHtyIGV2YWw9RkFMU0V9CmFkZEFubm90YXRpb25TaGFwZShjdXN0b21TaGFwZT0iUkVDVEFOR0xFIixuZXR3b3JrPSdjdXJyZW50Jyx4LnBvcz0yMjUwLCB5LnBvcz0yMzkwLCBmaWxsQ29sb3I9JyNlMGYzZGInLCBoZWlnaHQ9MjAwLCB3aWR0aD0yNDApCmBgYAoKCkJ5IGRlZmF1bHQgdGhlIHNoYXBlIHdpbGwgYmUgZHJhd24gb24gdGhlIGZvcmVncm91bmQgY2FudmFzLCBvYnN0cnVjdGluZyBhbnkgbm9kZXMgYmVoaW5kIGl0LiBUbyBtb3ZlIGl0IHRvIHRoZSBiYWNrZ3JvdW5kIGNhdm5hcywgc2VsZWN0IHRoZSBzaGFwZSBpbiB0aGUgTGF5ZXJzIHRhYiBpbiB0aGUgQW5ub3RhdGlvbiBwYW5lbCBhbmQgY2xpY2sgdGhlIFB1c2ggQW5ub3RhdGlvbnMgdG8gQmFja2dyb3VuZCBMYXllciBhcnJvdyBqdXN0IGJlbG93IHRoZSBsaXN0LgoKT3IgeW91IGNhbiBhZGQgY2FudmFzIGFyZ3VtZW50IGluIHlvdXIgZnVuY3Rpb24uCkZpcnN0LCBsZXQgdXMgZGVsZXRlIHRoaXMgc2hhcGUgYW5ub3RhdGlvbi4KYGBge3IgZXZhbD1GQUxTRX0KZGVsZXRlQW5ub3RhdGlvbihuYW1lcz0iU2hhcGUgMSIpCmBgYApUaGVuLCB3ZSBhZGQgdGhlIGNvcnJlY3Qgb25lLgpgYGB7ciBldmFsPUZBTFNFfQphZGRBbm5vdGF0aW9uU2hhcGUoY3VzdG9tU2hhcGU9IlJFQ1RBTkdMRSIsIGNhbnZhcz0nYmFja2dyb3VuZCcsbmV0d29yaz0nY3VycmVudCcseC5wb3M9MjI1MCwgeS5wb3M9MjM5MCwgZmlsbENvbG9yPScjZTBmM2RiJywgaGVpZ2h0PTIwMCwgd2lkdGg9MjQwKQpgYGAKQXMgdXN1YWwsIHlvdSBjYW4gY2hvb3NlIGJvcmRlciBjb2xvciwgYm9yZGVyIG9wYWNpdHksIGZpbGwgY29sb3IgYW5kIG90aGVyIHBhcmFtZXRlcnMgYnkgYWRkaW5nIGFyZ3VtZW50cyBpbiB0aGUgY29tbWFuZC4KCllvdSBjYW4gZmluZCBvdGhlciBjb21tYW5kIGFyZ3VtZW50cyBbaGVyZV0oaHR0cDovL2xvY2FsaG9zdDoxMjM0L3YxL3N3YWdnZXJVSS9zd2FnZ2VyLXVpL2luZGV4Lmh0bWw/dXJsPWh0dHAlM0ElMkYlMkZsb2NhbGhvc3QlM0ExMjM0JTJGdjElMkZjb21tYW5kcyUyRnN3YWdnZXIuanNvbiMhL2Fubm90YXRpb24vYW5ub3RhdGlvbl9hZGRfc2hhcGUpLgoKCiMgRWRpdGluZyBBbm5vdGF0aW9ucwpFeGlzdGluZyBhbm5vdGF0aW9ucyBjYW4gYmUgdXBkYXRlZCB2aWEgYW5ub3RhdGlvbiB1cGRhdGUgY29tbWFuZHMuIFlvdSBtYXkgbm90aWNlIHRoYXQgZWFjaCBhbm5vdGF0aW9uIGhhcyBpdHMgb3duIHVuaXF1ZSBJRC4gV2hlbiB5b3Ugd2FudCB0byB1cGRhdGUgYSBleGlzaXRpbmcgYW5ub3RhaW9uLCB0aGUgdW5pcXVlIElEIGlzIHJlcXVpcmVkLiBZb3UgY2FuIGFsc28gdXNlIGFubm90YXRpb24gbmFtZXMgdG8gdXBkYXRlIHRoZSBhbm5vdGF0aW9uLgoKQWxsIGFubm90YXRpb24gSUQgY2FuIGJlIGZvdW5kIGJ5IGxpc3RpbmcgYW5ub3RhdGlvbi4KYGBge3IgZXZhbD1GQUxTRX0KYW5ub3RhdGlvbkxpc3QgPC0gZ2V0QW5ub3RhdGlvbkxpc3QobmV0d29yaz0nY3VycmVudCcpCmFubm90YXRpb25MaXN0CmBgYAoKCg==